const BASE_URL = 'https://wxapp.well-talk.com';
let request_list = [];
let is_login = false;//是否登录
let request_num = 0; // 请求数
let loadingTimer;
const app = getApp();
import Vue from 'vue'
/**
 * 获取访问token
 */
const login = cb => {
  // 记录所有请求
  request_list.push(cb)
  // 防止重复请求登录
  if (!is_login) {
    app.globalData.LOGION = true;
	is_login=true
  } else {
    return
  }
  // 登录请求
  uni.login({
    success: function (res) {
      request({
        url: `/${app.globalData.userIdentity==0?'api':'teacher'}/v1/user/auth?code=${res.code}`, 
      }).then(res => {
		  // console.log(res)
        if (res.code == 1) {
		  uni.setStorageSync('app_token',app.globalData.userIdentity==0?res.data.token:res.data.teachertoken);
          // 全部请求回调
          request_list.forEach(cb => {
            cb && cb()
          })
          request_list = [];
          is_login = true;
        }else if(res.code==991||res.code==992){//当前用户是教师，登了学生的
			request_list.forEach(cb => {
				if(cb){
					let obj = {
						identityError:true,
						requestData:res
					}
					cb(obj)
				}
			})
			app.globalData.LOGION = false;
			request_list = [];
		}else if(res.code==9997){//请先绑定手机号
			uni.setStorageSync('wxapp_openid',res.data.wxapp_openid);
			request_list.forEach(cb => {
			  cb && cb()
			})
			app.globalData.LOGION = false;
		}
      })
    }
  })
}


/**
 * 数据请求封装
 */
const request = obj => {
	let _this = this;
  return new Promise((resolve, reject) => {
	  // console.log(obj)
    uni.showNavigationBarLoading()//在标题栏中显示加载
	obj.requestNum = (obj.hasOwnProperty('requestNum') ? obj.requestNum:true)//当前请求是否要计算请求数（用于不需要回调的接口，如消息已读等，只需要请求，计数会造成后续计数错误）
	if(obj.requestNum){ //
	// console.log(123)
		request_num += 1
	}
    obj.showOnload = (obj.hasOwnProperty('showOnload') ? obj.showOnload:true) // 有该属性的认该属性，没有的默认为true
		// console.log('执行前',request_num,obj)
    if (request_num == 1 && obj.showOnload&&obj.requestNum) {
      Vue.prototype.showLoading('加载中')
    }
    uni.request({
      url: (obj.url.match(new RegExp("^http.*$"))?'':BASE_URL)+ obj.url, // 不是http开头的域名才拼接
      data: obj.data ||{},
      header: {
		[app.globalData.userIdentity==0?'token':'teachertoken']: uni.getStorageSync('app_token'),
        // 'Content-Type':'application/x-www-form-urlencoded'
        'Content-Type':(obj.method=='POST'||obj.method=='post')?'application/json':'application/x-www-form-urlencoded'
		
      },
      method: obj.method || 'POST',
      success:res=>{
		    //通用错误
		    // 0 => '',
		    // 1 => '请求成功',
		    // 401 => '请先登录',
		    // 402 => '请先登录',
		    // 405 => "暂无数据",
		    // 403 => '拒绝访问',
		//     999 => '未知异常',
		//     998 => '没有数据',
		//     997 => '生成小程序码失败',
		//     996 => '请输入正确的手机号',
		//     995 => '您今天请求的验证码过多，请明天再试',
		//     994 => '验证码已过期或无效',
		//     993 => 'teachertoken无效或已过期',
		//     992 => '您是教师，请登录教师端',
		//     991 => '您是学生，请登录学生端',
		//     990 => '会话密钥session_key无效，请先授权',
		//     899 => 'iv无效',
		//     888 => '网络开小差，请重新操作',
		//     //用户模块：9xxx
		//     9998 => '账号已被冻结，请联系管理员',
		//     9997 => '请先绑定手机号',
		//     9996 => '用户不存在',
		//     9995 => '需求不存在',
		//     9994 => '请先授权登录',
		//     9993 => '手机号已被绑定，请使用其他手机号',
		//     9992 => '您是教师，请登录教师端',
		//     //课程模块：10xxx
		//     10000 => '你已经发布过需求了，无需再次发布',
		//     10001 => '该教师教师已停止接单，请下次及时预约',
		//     10002 => '暂无课程评论',
		//     10003 => '账户余额不足，请及时充值',
		//     10004 => '请求类型错误',
		//     10005 => '需求不存在',
		//     10006 => '您是教师，请登录教师端',
		//     10007 => '该手机号已被注册，请使用新的手机号',
		//     10008 => '暂无课程',
		//     //地址：11xxx
		//     11000 => '暂无省市区数据',
		//     11001 => '地址不存在',
		//     //授课形式
		//     12000 => '暂无授课形式',
		//     //订单
		//     13000 => '请确定上课的次数',
		//     13001 => '订单不存在',
		//     13002 => '支付失败，请联系管理员',
		//     13003 => '订单已取消或已支付',
		//     13004 => '请选择正确的支付方式',
		//     13005 => '订单已评价',
		//     13006 => '请先完成课程',
		//     13007 => '您暂无可退款的课次',
		//     13008 => '亲，待上课时才可以申请',
		//     13009 => '暂无退款信息',
		//     13010 => '退款信息已取消或完成',
		//     13011 => '评论不存在',
		//     //课表
		//     14000 => '课表不存在',
		//     14001 => '此课表已预约上课时间',
		//     14002 => '请先完成课程',
		//     14003 => '请先预约前面课次',
		//     //充值
		//     15000 => '充值套餐不存在',
		//     //问卷需求
		//     16000 => '需求条件不存在',
		//     //消息提醒
		//     17000 => '课程提醒不存在',
		//     17001 => '订单提醒不存在',
		//     //公告
		//     18000 => '公告不存在',
		//     //资讯
		//     19000 => '资讯不存在',
		//     //教师
		//     20000 => '教师不存在',
		//     20001 => '账户余额不足',
		//     20002 => '您还未实名认证，请先验证或等待审核',
		//     20003 => '课件不存在',
		
        if (res.data.hasOwnProperty('code')&&(res.data.code == 401||res.data.code == 402)) { //用户身份过期
		// console.log('用户身份过期')
			is_login=false
			login((res) => {
				if(res.hasOwnProperty('identityError')){//身份出错
					resolve(res.requestData)
				}else{
					request(obj).then(res => {
					  resolve(res)
					})
				}
			})
        }else{
			// console.log('成功回调')
          // console.log('请求成功', res)
          // resolve(is_login ? res :res.data);
          resolve(res.data);
        }
      },
      fail:err=>{
        reject(err)
      },
      complete: function (res) {
		  if(obj.requestNum){
			  request_num-=1
		  }
		// console.log(request_num)
		// console.log('执行后',request_num,obj)
        if (request_num == 0 && obj.showOnload&&obj.requestNum) {
          Vue.prototype.hideLoading()
        }
        uni.hideNavigationBarLoading()//完成停止加载
		uni.stopPullDownRefresh() //停止下拉刷新
		// 最长3s自动关闭
		loadingTimer = setTimeout(() => {
			if (request_num > 0) {
				 uni.hideNavigationBarLoading()//完成停止加载
			}
		}, 3000);
      }
    })
  })
}

export default request;